import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Author Mr.An
 * @Date 18/7/5 下午5:45
 */
public class TestInherit {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        A a=new A(22,"wang");
        a.printa();
        B b=new B(323.2);
        b.printb();
        b.printa();
        b.printSuper();
        B b2=new B(33,"aaa",323.2);
        b2.printa();
        b2.printSuper();
        B b3=new B(323.3);
        b3.printa();
        b3.printSuper();
        Method methoda = A.class.getDeclaredMethod("printa", null);
        methoda.invoke(b2,null);
    }
}

class A{
    private int num;
    private String name;
    public String tag="A";
    A(){}
    A(int num,String name){
        this.num=num;
        this.name=name;
    }
    public void printa(){
        System.out.println(this.toString()+"--当前对象printa//"+name+"--:"+num);
    }
}

class B extends A{
    private double salary;
    public String tag="B";
    B(){}
    B(double s){
        this.salary=s;
    }
    B(int num,String name,double s){
        super(num,name);
        this.salary=s;
    }
    public void printb(){
        System.out.println(this.toString()+"--当前对象printb//"+salary+"///salary"+"//tag="+tag);
    }
    public void printSuper(){
        System.out.println(this.toString()+"--当前对象printSuper//"+"父类实例--"+super.toString()+"//super.tag="+super.tag);
    }
}

/**
 *运行结果:

 *
 *
 *
 * 如果子类的构造方法中调用了父类的构造器，子类实例的父类实例的对应的属性被赋值。调用继承的父类的方法，也能打印出来正确的父类私有属性。
 *
 * 子类定义时直接调用父类的私有方法编译器不通过。
 *
 * 但是在子类实例化的过程中，子类构造器默认调用父类的super()方法,
 * 每new 一个子类实例都默认调用一次super（）。或者子类构造器明确调用super(参数...)
 * super.toString()打印的对象和子类对象是同一个！！！
 * 说明子类实例和父类实例都是同一个对象中，但是父类的属性都会加上一个super. 比如super.
 * 而且调用继承的父类方法时可以访问到父类的私有属性。所以说子类实例的内存对象中存储着父类的私有变量
 * 但是不能显示的调用super.num等私有属性。就存在但不让你访问。 继承的父类方法是可以访问父类私有属性的。
 *
 *
 *
 *
 *
 A@51016012--当前对象printa//wang--:22
 B@29444d75--当前对象printb//323.2///salary//tag=B
 B@29444d75--当前对象printa//null--:0
 B@29444d75--当前对象printSuper//父类实例--B@29444d75//super.tag=A
 B@2280cdac--当前对象printa//aaa--:33
 B@2280cdac--当前对象printSuper//父类实例--B@2280cdac//super.tag=A
 B@1517365b--当前对象printa//null--:0
 B@1517365b--当前对象printSuper//父类实例--B@1517365b//super.tag=A
 B@2280cdac--当前对象printa//aaa--:33
 *
 *
 * JAVA实例化时跟 python的子类调用父类的init方法类似。
 * 实际上都是在一个实例化地址里面添加父类的属性。
 *.
 *
 */
